package logica;
import java.util.*;

public class DocumentoJerarquico {

	private String titulo;
	private String contenido;
	private Vector<String> contenidoSecciones;

	private Vector <String> tagsApertura;
	private Vector <String> tagsCierre;	

	
	public DocumentoJerarquico (String texto) throws Exception
	{
		
//		texto = texto.replace("\n", "");
//		texto = texto.replace("\t", "");
		texto = texto.trim();
		this.titulo = this.obtenerTitulo(texto);
		this.contenido = this.obtenerContenido(texto);

		this.tagsApertura = new Vector<String>();
		this.tagsCierre = new Vector<String>();

		//Tags de Apertura
		this.tagsApertura.add("<sec>");
		this.tagsApertura.add("<tit>");
		this.tagsApertura.add("<con>");

		//Tags de Cierre
		this.tagsCierre.add("</sec>");
		this.tagsCierre.add("</tit>");
		this.tagsCierre.add("</con>");

		
		this.contenidoSecciones = new Vector<String>();
		if (this.tieneSecciones())
		{
			this.contenidoSecciones = this.obtenerContenidoSecciones(this.contenido);			
		}

		
	}

	public Vector<String> getContenidoSecciones() {
		return contenidoSecciones;
	}

	public void setContenidoSecciones(Vector<String> contenidoSecciones) {
		this.contenidoSecciones = contenidoSecciones;
	}

	public boolean esTagApertura(String aTag)
	{
		return this.tagsApertura.contains(aTag);
	}
	
	public boolean tieneTagsApertura(String aText)
	{
		boolean contieneTag=false;
		for (int i=0; i<this.tagsApertura.size() && !contieneTag; i++)
		{
			contieneTag = aText.contains(this.tagsApertura.elementAt(i));
		}
		return contieneTag;
	}

	public boolean tieneTagsCierre(String aText)
	{
		boolean contieneTag=false;
		for (int i=0; i<this.tagsCierre.size() && !contieneTag; i++)
		{
			contieneTag = aText.contains(this.tagsCierre.elementAt(i));
		}
		return contieneTag;
	}
	
	
	public boolean esTagCierre(String aTag)
	{
		return this.tagsCierre.contains(aTag);
	}

	
	public String getTitulo() {
		return titulo;
	}

	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}
	
	public String getContenido() {
		return contenido;
	}

	public void setContenido(String contenido) {
		this.contenido = contenido;
	}

	public String obtenerTitulo(String texto)
	{
		return texto.substring(texto.indexOf("<tit>")+5, texto.indexOf("</tit>"));
	}
	
	public String obtenerContenido(String texto)
	{
		return texto.substring(texto.indexOf("<con>")+5, texto.lastIndexOf("</con>"));
	}
	
	public boolean tieneSecciones()
	{
		return (this.tieneTagsApertura(this.contenido) || this.tieneTagsCierre(this.contenido));
	}
	
	public Vector<String> obtenerContenidoSecciones(String aTexto) throws Exception
	{
		Vector<String> resultado=new Vector<String>();
		Stack<String> tags = new Stack<String>();
		String tag="";
		String seccion = "";
		

		while (aTexto.length()>0)
		{	//Caso base ya recorrimos y extragimos la seccion que queriamos.
			if(tags.empty() && seccion.length()>0)
			{
				resultado.addElement(seccion);
				seccion="";
			}
				
			int aperturaTag = aTexto.indexOf("<");
			int cierreTag = aTexto.indexOf(">");
			if (aperturaTag != -1 && cierreTag != -1)
			{
				tag = aTexto.substring(aperturaTag, cierreTag+1);
				//Se va guardando la seccion.
				seccion=seccion+aTexto.substring(0, cierreTag+1);
				//aTexto = new StringBuffer(aTexto.substring(cierreTag+1));
				aTexto = (new String(aTexto.substring(cierreTag+1).trim()));
				if (esTagApertura(tag))
				{
					tags.push(tag);							
				}
				else 
				{
					boolean esTagApertura= esTagApertura(tags.lastElement());
					String pop = tags.lastElement();
					String elementoSinSlash = tag.replace("/", "");
					
					if (tags.empty())
					{
						throw new Exception("Error: Pila Vacia");
					}
					else if (!esTagApertura || !(pop.equals(elementoSinSlash)))
					{
						throw new Exception("Error: Sintaxis con errores en el texto");
					}
					else
					{
						tags.pop();
					}
				}				
			}
			else
			{ // Hay error de sintaxis o quedan espacios.
				throw new Exception("Error: Sintaxis con errores en el texto");
			}
			
		}
		//Ultima seccion se nos vacio el String Buffer, je.
		if(tags.empty() && seccion.length()>0)
		{
			resultado.addElement(seccion);
			seccion="";
		}
		return resultado;
	}
}
